home *** CD-ROM | disk | FTP | other *** search
- /* file .c - handles the file activity */
-
- #include <string.h>
- #include <stdio.h>
- #include <assert.h>
- #include "SCSIDefines.h"
- #include "pstring.h"
-
- #include "Defines.h"
- #include "Prototypes.h"
-
- extern BUFFER *gBufferPtr;
- extern Str255 gParentDir;
-
- short WriteEOF(void)
- {
- char buffer[BLOCKSIZE];
-
- memset(buffer, 0, BLOCKSIZE);
- if (BufferWrite(gBufferPtr, buffer, BLOCKSIZE) == ERROR) return ERROR;
- return OK;
- }
-
- short WriteFile(Str255 name)
- {
- CInfoPBRec paramBlock; /* parameter block */
- OSErr error; /* error status */
- FInfo info; /* finder information */
- HEADER header; /* file header */
- short refNum; /* file path reference number */
- char buffer[BLOCKSIZE]; /* data buffer */
- long i; /* counter */
- long bytesLeft; /* number of bytes in last block */
- long count = BLOCKSIZE; /* number of bytes read */
-
- /* get file parameters */
-
- memset(¶mBlock, 0, sizeof(paramBlock));
- paramBlock.hFileInfo.ioNamePtr = name;
-
- error = PBGetCatInfo(¶mBlock, FALSE);
- if (error != noErr) return ERROR;
-
- /* set up fields of header */
-
- assert(sizeof(HEADER) == BLOCKSIZE);
- memset(&header, 0, sizeof(header));
- header.name[0] = name[0] - gParentDir[0];
- memcpy(&(header.name[1]), &(name[gParentDir[0] + 1]), name[0]);
- if ((paramBlock.hFileInfo.ioFlAttrib & IOFADIRECTORY) == 0)
- {
- header.directory = FALSE;
- header.type = paramBlock.hFileInfo.ioFlFndrInfo.fdType;
- header.creator = paramBlock.hFileInfo.ioFlFndrInfo.fdCreator;
- header.dataLength = paramBlock.hFileInfo.ioFlLgLen;
- header.rsrcLength = paramBlock.hFileInfo.ioFlRLgLen;
- }
- else
- {
- printf("DIRECTORY!!!\n");
- header.directory = TRUE;
- }
- header.creationDate = paramBlock.hFileInfo.ioFlCrDat;
- header.modificationDate = paramBlock.hFileInfo.ioFlMdDat;
- header.checksum = Checksum(&header, sizeof(header) - sizeof(header.checksum));
-
- /* write header */
-
- memset(buffer, 0, BLOCKSIZE);
- memcpy(buffer, &header, sizeof(header));
- if (BufferWrite(gBufferPtr, buffer, BLOCKSIZE) == ERROR) return ERROR;
-
- printf("%s\n", PtoCstr(header.name));
- if (header.directory == TRUE) return OK;
-
- /* now write data: shouldn't be any errors so no checking is done! */
-
- /* Resource fork */
-
- if (header.rsrcLength)
- {
- OpenRF(name, 0, &refNum);
-
- for (i = 0; i < (header.rsrcLength - BLOCKSIZE); i += BLOCKSIZE)
- {
- FSRead(refNum, &count, buffer);
- BufferWrite(gBufferPtr, buffer, BLOCKSIZE);
- }
- bytesLeft = header.rsrcLength - i;
- if (bytesLeft > 0)
- {
- memset(buffer, 0, BLOCKSIZE);
- FSRead(refNum, &bytesLeft, buffer);
- BufferWrite(gBufferPtr, buffer, BLOCKSIZE);
- }
-
- FSClose(refNum);
- }
-
- /* Data fork */
-
- if (header.dataLength)
- {
- FSOpen(name, 0, &refNum);
-
- for (i = 0; i < (header.dataLength - BLOCKSIZE); i += BLOCKSIZE)
- {
- FSRead(refNum, &count, buffer);
- BufferWrite(gBufferPtr, buffer, BLOCKSIZE);
- }
- bytesLeft = header.dataLength - i;
- if (bytesLeft > 0)
- {
- memset(buffer, 0, BLOCKSIZE);
- FSRead(refNum, &bytesLeft, buffer);
- BufferWrite(gBufferPtr, buffer, BLOCKSIZE);
- }
-
- FSClose(refNum);
- }
-
- return OK;
- }
-
- short ReadFile(void)
- {
- HEADER header; /* file header */
- short refNum; /* file path reference number */
- char buffer[BLOCKSIZE]; /* data buffer */
- long i; /* counter */
- long bytesLeft; /* number of bytes in last block */
- long count = BLOCKSIZE; /* number of bytes read */
- OSErr error; /* error return */
- HParamBlockRec pb; /* parameter block */
- Str255 name; /* reassembled filename */
-
- /* read header */
-
- if (BufferRead(gBufferPtr, buffer, BLOCKSIZE) == ERROR) return ERROR;
- memcpy(&header, buffer, sizeof(header));
-
- /* check checksum */
-
- if (Checksum(&header, sizeof(header) - sizeof(header.checksum)) != header.checksum)
- return ERROR;
-
- if (header.checksum == 0) return FILE_END;
-
- Pstrcpy(name, gParentDir);
- Pstrcat(name, header.name);
- printf("%s\n",PtoCstr(header.name));
-
- if (header.directory == TRUE)
- {
- memset(&pb, 0, sizeof(pb));
- pb.fileParam.ioNamePtr = name;
- error = PBDirCreate(&pb, FALSE);
- return OK;
- }
-
- /* now read data */
-
- error = Create(name, 0, header.creator, header.type);
- if (error != noErr) return ERROR;
-
- /* Resource fork */
-
- if (header.rsrcLength)
- {
- OpenRF(name, 0, &refNum);
-
- for (i = 0; i < (header.rsrcLength - BLOCKSIZE); i += BLOCKSIZE)
- {
- BufferRead(gBufferPtr, buffer, BLOCKSIZE);
- FSWrite(refNum, &count, buffer);
- }
- bytesLeft = header.rsrcLength - i;
- if (bytesLeft > 0)
- {
- BufferRead(gBufferPtr, buffer, BLOCKSIZE);
- FSWrite(refNum, &bytesLeft, buffer);
- }
-
- FSClose(refNum);
- }
-
- /* Data fork */
-
- if (header.dataLength)
- {
- FSOpen(name, 0, &refNum);
-
- for (i = 0; i < (header.dataLength - BLOCKSIZE); i += BLOCKSIZE)
- {
- BufferRead(gBufferPtr, buffer, BLOCKSIZE);
- FSWrite(refNum, &count, buffer);
- }
- bytesLeft = header.dataLength - i;
- if (bytesLeft > 0)
- {
- BufferRead(gBufferPtr, buffer, BLOCKSIZE);
- FSWrite(refNum, &bytesLeft, buffer);
- }
-
- FSClose(refNum);
- }
-
- return OK;
- }
-
- short ListFile(void)
- {
- HEADER header; /* file header */
- short refNum; /* file path reference number */
- char buffer[BLOCKSIZE]; /* data buffer */
- long i; /* counter */
- long bytesLeft; /* number of bytes in last block */
- long count = BLOCKSIZE; /* number of bytes read */
- OSErr error; /* eror return */
-
- /* read header */
-
- if (BufferRead(gBufferPtr, buffer, BLOCKSIZE) == ERROR) return ERROR;
- memcpy(&header, buffer, sizeof(header));
-
- /* check checksum */
-
- if (Checksum(&header, sizeof(header) - sizeof(header.checksum)) != header.checksum)
- return ERROR;
-
- if (header.checksum == 0) return FILE_END;
-
- printf("%s\n",PtoCstr(header.name));
-
- /* now read data */
-
- /* Resource fork */
-
- for (i = 0; i < (header.rsrcLength - BLOCKSIZE); i += BLOCKSIZE)
- {
- BufferRead(gBufferPtr, buffer, BLOCKSIZE);
- }
- bytesLeft = header.rsrcLength - i;
- if (bytesLeft > 0)
- {
- BufferRead(gBufferPtr, buffer, BLOCKSIZE);
- }
-
- /* Data fork */
-
- for (i = 0; i < (header.dataLength - BLOCKSIZE); i += BLOCKSIZE)
- {
- BufferRead(gBufferPtr, buffer, BLOCKSIZE);
- }
- bytesLeft = header.dataLength - i;
- if (bytesLeft > 0)
- {
- BufferRead(gBufferPtr, buffer, BLOCKSIZE);
- }
-
- return OK;
- }
-
- long Checksum(void *bufferPtr, long count)
- {
- long i;
- long sum = 0;
- char *ptr;
-
- ptr = (char *)bufferPtr;
- for (i = 0; i < count; i++)
- {
- sum += *ptr;
- ptr++;
- }
-
- return sum;
- }
-
-
-